#-*- coding: utf-8 -*-

def almost_equals(x, y, eps):
    return abs(x-y) < eps

def fct_2x(x):
    return 2*x

def fct_x2(x):
    return x**2

def approx_int(f, a, b, epsilon, n=2, last=0):
    #La fonction f(x) doit être continue, strictement positive et apériodique
    #Les bornes doivent être dans le bon ordre (a<b)
    dX = (float(b)-a) / n
    print "deltaX=",dX,"last=",last #DEBUG
    area = 0
    for i in range(n):
        area += f(a+i*dX) * dX
    if almost_equals(area, last, epsilon):
        return area
    else:
        return approx_int(f, a, b, epsilon, n*2, area)
    

print approx_int(fct_2x, 0, 10, 1**-9)
#primitive de 2x c'est 2*x²/2=x²
#10²=100, donc ça doit valoir +- ça
print approx_int(fct_x2, 0, 10, 1**-9)
#primitive de x² c'est x³/3
#10³/3=1000/3=333.33, donc ça doit valoir +- ça
